/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ws.converter;

import entidade.persistencia.ProdutoNumeroSerie;
import java.net.URI;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import entidade.persistencia.Produto;
import entidade.persistencia.ProdutoManutencao;
import entidade.persistencia.ReparoProdutoNumeroSerie;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author victorinox
 */

@XmlRootElement(name = "produtoNumeroSerie")
public class ProdutoNumeroSerieConverter {
    private ProdutoNumeroSerie entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of ProdutoNumeroSerieConverter */
    public ProdutoNumeroSerieConverter() {
        entity = new ProdutoNumeroSerie();
    }

    /**
     * Creates a new instance of ProdutoNumeroSerieConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public ProdutoNumeroSerieConverter(ProdutoNumeroSerie entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getNumeroSerieId() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getProdutoNumeroSerieCollection();
        getProdutoNumeroSerieCollection1();
        getProdutoId();
        getReparoProdutoNumeroSerieCollection();
        getProdutoManutencaoCollection();
    }

    /**
     * Creates a new instance of ProdutoNumeroSerieConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public ProdutoNumeroSerieConverter(ProdutoNumeroSerie entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for numeroSerieId.
     *
     * @return value for numeroSerieId
     */
    @XmlElement
    public Integer getNumeroSerieId() {
        return (expandLevel > 0) ? entity.getNumeroSerieId() : null;
    }

    /**
     * Setter for numeroSerieId.
     *
     * @param value the value to set
     */
    public void setNumeroSerieId(Integer value) {
        entity.setNumeroSerieId(value);
    }

    /**
     * Getter for numeroSerie.
     *
     * @return value for numeroSerie
     */
    @XmlElement
    public String getNumeroSerie() {
        return (expandLevel > 0) ? entity.getNumeroSerie() : null;
    }

    /**
     * Setter for numeroSerie.
     *
     * @param value the value to set
     */
    public void setNumeroSerie(String value) {
        entity.setNumeroSerie(value);
    }

    /**
     * Getter for identificacao.
     *
     * @return value for identificacao
     */
    @XmlElement
    public String getIdentificacao() {
        return (expandLevel > 0) ? entity.getIdentificacao() : null;
    }

    /**
     * Setter for identificacao.
     *
     * @param value the value to set
     */
    public void setIdentificacao(String value) {
        entity.setIdentificacao(value);
    }

    /**
     * Getter for lote.
     *
     * @return value for lote
     */
    @XmlElement
    public String getLote() {
        return (expandLevel > 0) ? entity.getLote() : null;
    }

    /**
     * Setter for lote.
     *
     * @param value the value to set
     */
    public void setLote(String value) {
        entity.setLote(value);
    }

    /**
     * Getter for statusAnalize.
     *
     * @return value for statusAnalize
     */
    @XmlElement
    public Boolean getStatusAnalize() {
        return (expandLevel > 0) ? entity.getStatusAnalize() : null;
    }

    /**
     * Setter for statusAnalize.
     *
     * @param value the value to set
     */
    public void setStatusAnalize(Boolean value) {
        entity.setStatusAnalize(value);
    }

    /**
     * Getter for prontoVenda.
     *
     * @return value for prontoVenda
     */
    @XmlElement
    public Boolean getProntoVenda() {
        return (expandLevel > 0) ? entity.getProntoVenda() : null;
    }

    /**
     * Setter for prontoVenda.
     *
     * @param value the value to set
     */
    public void setProntoVenda(Boolean value) {
        entity.setProntoVenda(value);
    }

    /**
     * Getter for prontoVendaObs.
     *
     * @return value for prontoVendaObs
     */
    @XmlElement
    public String getProntoVendaObs() {
        return (expandLevel > 0) ? entity.getProntoVendaObs() : null;
    }

    /**
     * Setter for prontoVendaObs.
     *
     * @param value the value to set
     */
    public void setProntoVendaObs(String value) {
        entity.setProntoVendaObs(value);
    }

    /**
     * Getter for produtoNumeroSerieCollection.
     *
     * @return value for produtoNumeroSerieCollection
     */
    @XmlElement
    public ProdutoNumeroSeriesConverter getProdutoNumeroSerieCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoNumeroSerieCollection() != null) {
                return new ProdutoNumeroSeriesConverter(entity.getProdutoNumeroSerieCollection(), uri.resolve("produtoNumeroSerieCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoNumeroSerieCollection.
     *
     * @param value the value to set
     */
    public void setProdutoNumeroSerieCollection(ProdutoNumeroSeriesConverter value) {
        entity.setProdutoNumeroSerieCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for produtoNumeroSerieCollection1.
     *
     * @return value for produtoNumeroSerieCollection1
     */
    @XmlElement
    public ProdutoNumeroSeriesConverter getProdutoNumeroSerieCollection1() {
        if (expandLevel > 0) {
            if (entity.getProdutoNumeroSerieCollection1() != null) {
                return new ProdutoNumeroSeriesConverter(entity.getProdutoNumeroSerieCollection1(), uri.resolve("produtoNumeroSerieCollection1/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoNumeroSerieCollection1.
     *
     * @param value the value to set
     */
    public void setProdutoNumeroSerieCollection1(ProdutoNumeroSeriesConverter value) {
        entity.setProdutoNumeroSerieCollection1((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for produtoId.
     *
     * @return value for produtoId
     */
    @XmlElement
    public ProdutoConverter getProdutoId() {
        if (expandLevel > 0) {
            if (entity.getProdutoId() != null) {
                return new ProdutoConverter(entity.getProdutoId(), uri.resolve("produtoId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for produtoId.
     *
     * @param value the value to set
     */
    public void setProdutoId(ProdutoConverter value) {
        entity.setProdutoId((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for reparoProdutoNumeroSerieCollection.
     *
     * @return value for reparoProdutoNumeroSerieCollection
     */
    @XmlElement
    public ReparoProdutoNumeroSeriesConverter getReparoProdutoNumeroSerieCollection() {
        if (expandLevel > 0) {
            if (entity.getReparoProdutoNumeroSerieCollection() != null) {
                return new ReparoProdutoNumeroSeriesConverter(entity.getReparoProdutoNumeroSerieCollection(), uri.resolve("reparoProdutoNumeroSerieCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for reparoProdutoNumeroSerieCollection.
     *
     * @param value the value to set
     */
    public void setReparoProdutoNumeroSerieCollection(ReparoProdutoNumeroSeriesConverter value) {
        entity.setReparoProdutoNumeroSerieCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for produtoManutencaoCollection.
     *
     * @return value for produtoManutencaoCollection
     */
    @XmlElement
    public ProdutoManutencaoesConverter getProdutoManutencaoCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoManutencaoCollection() != null) {
                return new ProdutoManutencaoesConverter(entity.getProdutoManutencaoCollection(), uri.resolve("produtoManutencaoCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoManutencaoCollection.
     *
     * @param value the value to set
     */
    public void setProdutoManutencaoCollection(ProdutoManutencaoesConverter value) {
        entity.setProdutoManutencaoCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    @XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the ProdutoNumeroSerie entity.
     *
     * @return an entity
     */
    @XmlTransient
    public ProdutoNumeroSerie getEntity() {
        if (entity.getNumeroSerieId() == null) {
            ProdutoNumeroSerieConverter converter = UriResolver.getInstance().resolve(ProdutoNumeroSerieConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved ProdutoNumeroSerie entity.
     *
     * @return an resolved entity
     */
    public ProdutoNumeroSerie resolveEntity(EntityManager em) {
        List<ProdutoNumeroSerie> produtoNumeroSerieCollection = entity.getProdutoNumeroSerieCollection();
        List<ProdutoNumeroSerie> newprodutoNumeroSerieCollection = new java.util.ArrayList<ProdutoNumeroSerie>();
        for (ProdutoNumeroSerie item : produtoNumeroSerieCollection) {
            newprodutoNumeroSerieCollection.add(em.getReference(ProdutoNumeroSerie.class, item.getNumeroSerieId()));
        }
        entity.setProdutoNumeroSerieCollection(newprodutoNumeroSerieCollection);
        List<ProdutoNumeroSerie> produtoNumeroSerieCollection1 = entity.getProdutoNumeroSerieCollection1();
        List<ProdutoNumeroSerie> newprodutoNumeroSerieCollection1 = new java.util.ArrayList<ProdutoNumeroSerie>();
        for (ProdutoNumeroSerie item : produtoNumeroSerieCollection1) {
            newprodutoNumeroSerieCollection1.add(em.getReference(ProdutoNumeroSerie.class, item.getNumeroSerieId()));
        }
        entity.setProdutoNumeroSerieCollection1(newprodutoNumeroSerieCollection1);
        Produto produtoId = entity.getProdutoId();
        if (produtoId != null) {
            entity.setProdutoId(em.getReference(Produto.class, produtoId.getProdutoId()));
        }
        List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollection = entity.getReparoProdutoNumeroSerieCollection();
        List<ReparoProdutoNumeroSerie> newreparoProdutoNumeroSerieCollection = new java.util.ArrayList<ReparoProdutoNumeroSerie>();
        for (ReparoProdutoNumeroSerie item : reparoProdutoNumeroSerieCollection) {
            newreparoProdutoNumeroSerieCollection.add(em.getReference(ReparoProdutoNumeroSerie.class, item.getReparoProdutoNumeroSerieId()));
        }
        entity.setReparoProdutoNumeroSerieCollection(newreparoProdutoNumeroSerieCollection);
        List<ProdutoManutencao> produtoManutencaoCollection = entity.getProdutoManutencaoCollection();
        List<ProdutoManutencao> newprodutoManutencaoCollection = new java.util.ArrayList<ProdutoManutencao>();
        for (ProdutoManutencao item : produtoManutencaoCollection) {
            newprodutoManutencaoCollection.add(em.getReference(ProdutoManutencao.class, item.getProdutoManutencaoPK()));
        }
        entity.setProdutoManutencaoCollection(newprodutoManutencaoCollection);
        return entity;
    }
}
